package org.luxor.commons.workflow.service;

import org.activiti.engine.runtime.ProcessInstance;
import org.luxor.commons.workflow.entity.ProcessInstanceQuery;
import org.luxor.commons.workflow.entity.StartProcess;

import java.io.InputStream;
import java.util.List;

/**
 * 流程实例管理,包括启动、推进、删除流程实例等操作
 *
 * @author Mr.yan  @date 2021/10/16
 */
public interface IRuntimeCoreService {

    /**
     * 发起流程
     *
     * @param start 启动参数
     * @return org.activiti.engine.runtime.ProcessInstance
     */
    ProcessInstance start(StartProcess start);

    /**
     * 分页列表（运行中的流程实例列表）
     *
     * @param query 查询条件
     * @return org.luxor.commons.jdbc.metadata.PageResult<org.activiti.engine.repository.ProcessDefinition>
     */
    List<ProcessInstance> list(ProcessInstanceQuery query);

    /**
     * 获取流程实例
     *
     * @param processInstanceId 流程实例ID
     * @return org.activiti.engine.runtime.ProcessInstance
     */
    ProcessInstance get(String processInstanceId);

    /**
     * 获取预览图(流程实例运行情况概览图)
     *
     * @param processInstanceId 流程实例ID
     * @return java.io.InputStream
     */
    InputStream getImage(String processInstanceId);

    /**
     * 终止
     * <p>
     * 会删除流程实例相关数据,但不会删除流程定义和实例执行的历史数据(历史数据会增加delete_reason字段值)。
     *
     * @param processInstanceId 流程实例ID
     * @param cancelReason      终止原因
     */
    void cancel(String processInstanceId, String cancelReason);

    /**
     * 激活
     *
     * @param processInstanceId 流程实例ID
     */
    void activate(String processInstanceId);

    /**
     * 挂起
     * <p>
     * 处于挂起状态的流程实例，将不会执行与之关联的作业(计时器、消息)
     *
     * @param processInstanceId 流程实例ID
     */
    void suspend(String processInstanceId);

}
